package jp.co.katagaki.crossword.create;

import org.apache.commons.lang.StringUtils;

/**
 * クロスワードパズルのキーワードを生成するための案となる情報を保持するクラス。
 *
 * @author naotake
 */
class WordPlanPair {

    private String wordChar;
    private int wordPoint;

    private WordPlanPair(String wordChar, int wordPoint) {
        this.wordChar = wordChar;
        this.wordPoint = wordPoint;
    }

    /**
     * キーワードを生成するための案を保持するインスタンスを生成する。<br />
     * 案となる文字が null、もしくは空文字の場合、案となる文字位置が 0 より小さい場合、
     * {@link IllegalArgumentException}を送出することに注意すること。
     *
     * @param wordChar
     *            案となる文字
     * @param wordPoint
     *            案となる文字位置
     * @return {@link WordPlanPair}
     * @throws IllegalArgumentException
     *             不正な引数が指定された場合
     *             <ul>
     *             <li>案となる文字が null, もしくは空文字の場合</li>
     *             <li>案となる文字位置が 0 より小さい場合</li>
     *             </ul>
     */
    public static WordPlanPair valueOf(String wordChar, int wordPoint) {
        verify(wordChar, wordPoint);

        return new WordPlanPair(wordChar, wordPoint);
    }

    private static void verify(String wordChar, int wordPoint) {
        if (StringUtils.isEmpty(wordChar)) {
            throw new IllegalArgumentException("案となる文字は必須です。");
        }
        if (wordPoint < 1) {
            throw new IllegalArgumentException("案となる文字位置は 1 以上でなければなりません。");
        }
    }

    /**
     * 案となる文字を取得します。
     *
     * @return 案となる文字
     */
    public String getWordChar() {
        return wordChar;
    }

    /**
     * 案となる文字位置を取得します。
     *
     * @return 案となる文字位置
     */
    public int getWordPoint() {
        return wordPoint;
    }
}
